home *** CD-ROM | disk | FTP | other *** search
- To port klibc to a new architecture, you need:
-
- a) A directory structure
-
- Each archtecture has a klibc/arch/ directory, which should include an
- MCONFIG and a Makefile.inc file, and an include/arch/ directory, which
- includes some architecture-specific header files, including
- klibc/archconfig.h.
-
-
- b) Architecture-specific configuration
- (include/arch/*/klibc/sysconfig.h)
-
- This file can set configuration variables from
- include/klibc/sysconfig.h.
-
-
- c) Startup code
- (klibc/arch/*/crt0.S)
-
- The crt0.S assembly routine typically corresponds to the following
- pseudo-C code. In addition, each architecture needs any support
- routines that gcc-generated code expects to find in the system library
- -- Alpha, for example, needs divide subroutines.
-
- The "getenvtest" test program is a very good test for proper crt0.S
- functionality.
-
-
- extern __noreturn __libc_init(void *, void *);
-
- __noreturn _start(void)
- {
- void *elf_data = get_elf_data_address(); /* Usually the stack address */
- void *atexit_ptr = get_atexit_ptr(); /* Usually in a register */
-
- /* Some architectures need this for debugging to work */
- setup_null_stack_frame_if_necessary();
-
- __libc_init(elf_data, atexit_ptr);
- }
-
-
- d) A setenv implementation
- (klibc/arch/*/setjmp.S, include/arch/*klibc/archsetjmp.h)
-
- On most (but not all!) architectures, this entails creating a setjmp
- buffer big enough to hold all callee-saved registers, plus the stack
- pointer and the return address. In setjmp.S you have:
-
- * A "setjmp" function that writes out the callee-saved registers, the
- stack pointer and the return address to the buffer pointed to by the
- first argument, and then returns zero normally.
-
- On some architectures you need to take some kind of action to make
- sure the contents of the stack is actually manifest in memory and
- not cached in the CPU. In some cases (e.g. on SPARC) this will
- automatically spill the registers onto the stack; then they don't
- need to be spilled into the jmp_buf.
-
- * A "longjmp" function that read back these same registers from the
- jmp_buf pointed to by the first argument, and returns the second
- argument *to the address specified in the jmp_buf*.
-
- On some architectures you need to take some kind of action to flush
- any cached stack data or return stack.
-
-
- e) Any support functions needed by gcc, *unless* they are in libgcc
- *and* libgcc is usable for klibc on your particular platform. If
- libgcc isn't usable for klibc (on MIPS, for example, libgcc is
- compiled in a way that is not compatible with klibc) there are
- reasonably good clones of most of the libgcc functions in the libgcc
- directory. To use them, add them to ARCHOBJS in
- klibc/arch/*/Makefile.inc.
-
-
- f) A link location for the shared klibc. This should be specified in
- SHAREDFLAGS in klibc/arch/*/MCONFIG.
-
- This is not applicable to no-MMU architectures.
-